#include <stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>


#define NUM 5
typedef void(*func_t)();

func_t handlers[5];



void DownLoad()
{
    printf("我是一个下载的任务...\n");
}

void Flush()
{
    printf("我是一个刷新的任务...\n");
}

void Log()
{
    printf("我是一个日志记录的任务...\n");
}






void registerHandler(func_t h[],func_t f)
{
    int i=0;
    for(;i<NUM;i++)
    {
        if(h[i]==NULL)break;
    }
    if(i==NUM)return;
    h[i]=f;
    h[i+1]=NULL;
}



int main()
{
    registerHandler(handlers,DownLoad);
    registerHandler(handlers,Flush);
    registerHandler(handlers,Log);
    pid_t pid=fork();
    if(pid==0)
    {
    
        while(1)
        {
            printf("我是子进程，pid:%d\n",getpid());
            sleep(1);
        }
        

    }

    //sleep(10);
    
    while(1)
    {

    int status=0;
    pid_t wat=waitpid(pid,&status,WNOHANG);
    if(wat>0)
    {

        printf("进程等待成功，子进程的pid：%d，退出码：%d，信号：%d\n",wat,WEXITSTATUS(status),status&0x7F);
        break;
    }
    else if(wat==0)
    {
        int i=0;
        for(;handlers[i];i++)
        {
            handlers[i]();
        }
        printf("本次调用结束，子进程没有退出!\n");
        sleep(1);
    }
    else{
        printf("进程等待失败！\n");
        break;
    }
    }
   // sleep(10);
    return 0;
}
